package com.example.redisjson.service.impl;

import com.example.redisjson.documents.Event;
import com.example.redisjson.service.EventService;
import com.redis.om.spring.search.stream.EntityStream;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

import java.time.LocalDateTime;
import java.util.List;
import java.util.stream.Collectors;

@Service
@RequiredArgsConstructor
public class EventServiceImpl implements EventService {

  private final EntityStream entityStream;

  @Override
  public List<Event> searchByBeginDateBetween(LocalDateTime start, LocalDateTime end) {

    return entityStream
            .of(Event.class)
            .filter(Event$.BEGIN_DATE.between(start, end))
            .collect(Collectors.toList());
  }

}

/*
使用实体流进行流畅搜索
    Redis OM Spring 实体流提供了一个 Java 8 流接口，用于使用 Redis Stack 查询 Redis JSON 文档。
    实体流允许您以类似于 SQL 语句的类型安全声明方式处理数据。流可用于将查询表达为一系列操作。

    Redis OM Spring 中的实体流提供与 Java 8 流相同的语义。流可以由 Redis 映射实体（@Document）或实体的一个或多个属性组成。
    实体流逐步构建查询，直到调用终止操作（例如collect）。每当对流应用终止操作时，流就不能再接受其管道中的其他操作，这意味着流已启动。

实体元模型
    您将获得一个生成的元模型来生成更复杂的查询，该类与您的模型同名，但以美元符号结尾。在下面的示例中，我们的实体模型是 Person；因此，我们得到一个名为 Person$ 的元模型。
    使用元模型，您可以访问底层搜索引擎字段操作。例如，我们有一个 age 属性，它是一个整数。因此，我们的元模型具有一个 AGE 属性，该属性具有我们可以与流的 filter 方法一起使用的数字操作，
*/